package com.szwistar.common.hxdir;

import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

/**
 * 码组(即数据表中的一行数据)
 * @author ZhangYong
 * 注意：安卓系统的Sqlite3数据库驱动对字段名是区分大小写的！
 */
public class IRCodeGroup {
    @DatabaseField(id=true, columnName="SERIAL")
    public Integer id;
    @DatabaseField(columnName="BRAND_CN")
    public String brandCn;
    @DatabaseField(columnName="BRAND_EN")
    public String brandEn;
	@DatabaseField(columnName="MODEL")
    public String model;
	@DatabaseField(columnName="PINYIN")
    public String pinyin;
    @DatabaseField(columnName="CODE", dataType=DataType.BYTE_ARRAY)
    public byte[] code;

    @Override
	public String toString() {
		return "IRCodeGroup [" + id + "#" + brandCn + "(" + brandEn + ")-" + model + "]";
	}

	public byte[] getCode(int keyIndex, Object extraParam) {
		// 码表长度
		int codeSize = code.length;
		// 编码缓冲区
    	byte[] ret = new byte[10];

    	ret[0] = 0x30;                        // 固定
    	ret[1] = 0x00;                        // 固定
    	ret[2] = code[0];                     // formatIndex
    	ret[3] = code[1 + keyIndex * 2];      // 按键
    	ret[4] = code[1 + keyIndex * 2 + 1];  // 按键
    	ret[5] = code[codeSize - 4];          // 自定义码
    	ret[6] = code[codeSize - 3];          // 自定义码
    	ret[7] = code[codeSize - 2];          // 自定义码
    	ret[8] = code[codeSize - 1];          // 自定义码

    	int sum = 0;
    	for (int i = 0; i < 9; i++) { sum += ret[i]&0xFF; }
    	ret[9] = (byte)(sum & 0xFF);         // 校验码

    	return ret;
    }
}

@DatabaseTable(tableName="arc_table")
class IRCodeGroupAC extends IRCodeGroup {
	@Override
	public byte[] getCode(int keyIndex, Object extraParam) {
		// 必须提供空调当前状态
		ArcState arcState = (ArcState) extraParam;
		// 码表长度
		int codeSize = code.length;
		// 编码缓冲区
    	byte[] ret = new byte[2 + codeSize + 1];

		// 固定 2个字节：0x30,0x01
		ret[0] = 0x30;
		ret[1] = 0x01;

		// 拷贝码表
		System.arraycopy(code, 0, ret, 2, codeSize);

		// 修改其中的 7 个字节：空调状态
		ret[ 4] = arcState.temperature;
		ret[ 5] = arcState.windRate;    // 风量数据：自动：01,低：02,中：03,高：04
		ret[ 6] = arcState.windDir;     // 手动风向：向下：03,中：02,向上：01,默认02
		ret[ 7] = arcState.autoWindDir; // 自动风向：01,打开,00关,默认开:01
		ret[ 8] = arcState.power;       // 开关数据：开机时：0x01,关机时：0x00
		ret[ 9] = (byte) keyIndex;      // 当前按下的是哪个键, 电源：0x01,模式：0x02,风量：0x03,手动风向：0x04, 自动风向：0x05,温度加：0x06,  温度减：0x07
		ret[10] = arcState.mode;        // 模式对应数据和显示：自动（默认）：0x01,制冷：0X02,抽湿：0X03,送风：0x04;制热：0x05

		// 最后 1 个字节：校验和,为前面所有数据之和的低8位
		int sum = 0;
		for (int i = 0; i < ret.length-1; i++) { sum += ret[i]&0xFF; }
		ret[ret.length-1] = (byte)(sum & 0xFF);

		return ret;
    }
}

@DatabaseTable(tableName="pjt_table")     class IRCodeGroupPJT     extends IRCodeGroup {}
@DatabaseTable(tableName="fan_table")     class IRCodeGroupFAN     extends IRCodeGroup {}
@DatabaseTable(tableName="tvbox_table")   class IRCodeGroupTVBOX   extends IRCodeGroup {}
@DatabaseTable(tableName="dvd_table")     class IRCodeGroupDVD     extends IRCodeGroup {}
@DatabaseTable(tableName="tv_table")      class IRCodeGroupTV      extends IRCodeGroup {}
@DatabaseTable(tableName="iptv_table")    class IRCodeGroupIPTV    extends IRCodeGroup {}
@DatabaseTable(tableName="ado_table")     class IRCodeGroupAUDIO   extends IRCodeGroup {}
@DatabaseTable(tableName="water_table")   class IRCodeGroupWATER   extends IRCodeGroup {}
@DatabaseTable(tableName="air_table")     class IRCodeGroupAIR     extends IRCodeGroup {}
@DatabaseTable(tableName="sweeper_table") class IRCodeGroupSWEEPER extends IRCodeGroup {}
@DatabaseTable(tableName="lamp_table")    class IRCodeGroupLAMP    extends IRCodeGroup {}
@DatabaseTable(tableName="slr_table")     class IRCodeGroupCAMERA  extends IRCodeGroup {}
